www.gusucode.com > DuomiCms多米影视管理系统php源程序 v1.21源码程序 > DuomiCms V1.21 UTF-8 20151109/upload/admin/admin_database.php
<?php /** * 数据 * * @version 2015年7月12日Z by 海东青 * @package DuomiCms.Administrator * @copyright Copyright (c) 2015, SamFea, Inc. * @link http://www.duomicms.net */ require_once(dirname(__FILE__)."/config.php"); CheckPurview(); if(empty($action)) { $action = ''; } if($action=="optimize") { $tabletype = $dsql->GetVersion() > '4.1' ? 'Engine' : 'Type'; $optimizetable = ''; $totalsize = 0; $tablearray = array( 0 =>$cfg_dbprefix); if($submit!="ok"){ foreach($tablearray as $tp) { $dsql->SetQuery("SHOW TABLE STATUS LIKE '$tp%'"); $dsql->Execute('t'); while($table = $dsql->GetArray('t',MYSQL_BOTH)) { if($table['Data_free'] && $table[$tabletype] == 'MyISAM') { $checked = $table[$tabletype] == 'MyISAM' ? 'checked' : 'disabled'; $showtablerow[]=array( "<input class=\"checkbox\" type=\"checkbox\" name=\"optimizetables[]\" value=\"$table[Name]\" $checked>", $table[Name], $table[$tabletype], $table[Rows], $table[Data_length], $table[Index_length], $table[Data_free], ); $totalsize += $table['Data_length'] + $table['Index_length']; } } } }else{ foreach($tablearray as $tp) { $dsql->SetQuery("SHOW TABLE STATUS LIKE '$tp%'"); $dsql->Execute('t'); while($table = $dsql->GetArray('t',MYSQL_BOTH)) { if(is_array($optimizetables) && in_array($table['Name'], $optimizetables)) { $dsql->ExecuteNoneQuery("OPTIMIZE TABLE $table[Name]"); } $showtablerow[]=array( '', $table[Name], $dsql->GetVersion() > '4.1' ? $table['Engine'] : $table['Type'], $table[Rows], $table[Data_length], $table[Index_length], 0 ); $totalsize += $table['Data_length'] + $table['Index_length']; } } } include(duomi_ADMIN.'/html/admin_database_optimize.htm'); unset($showtablerow); exit(); } elseif($action=="bak") { $bkdir = duomi_DATA.'/'.$cfg_backup_dir; $gotojs = "function GotoNextPage(){document.gonext."."submit();}"."\r\nset"."Timeout('GotoNextPage()',500);"; $dojs = "<script language='javascript'>$gotojs</script>"; if(empty($tablearr)) { ShowMsg('你没选中任何表!','admin_database.php'); exit(); } if(!is_dir($bkdir)) { MkdirAll($bkdir,$cfg_dir_purview); } //初始化使用到的变量 $tables = explode(',',$tablearr); if(!isset($isstruct)) $isstruct = 0; if(!isset($startpos)) $startpos = 0; if(!isset($iszip)) $iszip = 0; if(empty($nowtable)) $nowtable = ''; if(empty($fsize)) $fsize = 2048; $fsizeb = $fsize * 1024; $nowtime = date('Y_m_d_H_i_s',time()); $bkfile = !isset($bkfile)?($bkdir."/duomicms_data_$nowtime.txt"):$bkfile; //第一页的操作 if($nowtable=='') { $tmsg = ''; /*$dh = dir($bkdir); while($filename=$dh->read()) { if(!m_ereg("txt$",$filename)) { continue; } $filename = $bkdir."/$filename"; if(!is_dir($filename)) { unlink($filename); } } $dh->close(); $tmsg .= "清除备份目录旧数据完成...<br />"; */ if($isstruct==1) { $bkstrufile = $bkdir."/duomicms_tables_struct_$nowtime.txt"; $mysql_version = $dsql->GetVersion(); $fp = fopen($bkstrufile,"w"); foreach($tables as $t) { fwrite($fp,"DROP TABLE IF EXISTS `$t`;\r\n"); $dsql->SetQuery("SHOW CREATE TABLE ".$dsql->dbName.".".$t); $dsql->Execute('me'); $row = $dsql->GetArray('me',MYSQL_BOTH); //去除AUTO_INCREMENT $row[1] = m_eregi_replace("AUTO_INCREMENT=([0-9]{1,})[ \r\n\t]{1,}","",$row[1]); //4.1以下版本备份为低版本 if($datatype==4.0 && $mysql_version > 4.0) { $eng1 = "ENGINE=MyISAM[ \r\n\t]{1,}DEFAULT[ \r\n\t]{1,}CHARSET=".$cfg_db_language; $tableStruct = m_eregi_replace($eng1,"TYPE=MyISAM",$row[1]); } //4.1以下版本备份为高版本 else if($datatype==4.1 && $mysql_version < 4.1) { $eng1 = "ENGINE=MyISAM DEFAULT CHARSET={$cfg_db_language}"; $tableStruct = m_eregi_replace("TYPE=MyISAM",$eng1,$row[1]); } //普通备份 else { $tableStruct = $row[1]; } fwrite($fp,''.$tableStruct.";\r\n\r\n"); } fclose($fp); $tmsg .= "备份数据表结构信息完成...<br />"; } $tmsg .= "<font color='red'>正在进行数据备份的初始化工作,请稍后...</font>"; $doneForm = "<form name='gonext' method='post' action='admin_database.php'> <input type='hidden' name='isstruct' value='$isstruct' /> <input type='hidden' name='action' value='bak' /> <input type='hidden' name='fsize' value='$fsize' /> <input type='hidden' name='tablearr' value='$tablearr' /> <input type='hidden' name='nowtable' value='{$tables[0]}' /> <input type='hidden' name='startpos' value='0' /> <input type='hidden' name='bkfile' value='$bkfile' /> <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n"; PutInfo($tmsg,$doneForm); exit(); } //执行分页备份 else { $fp = fopen($bkfile,"a"); $j = 0; $fs = $bakStr = ''; //分析表里的字段信息 $dsql->GetTableFields($nowtable); $intable = "INSERT INTO `$nowtable` VALUES("; while($r = $dsql->GetFieldObject()) { $fs[$j] = trim($r->name); $j++; } $fsd = $j-1; //读取表的内容 $dsql->SetQuery("Select * From `$nowtable` "); $dsql->Execute(); $m = 0; while($row2 = $dsql->GetArray()) { if($m < $startpos) { $m++; continue; } //检测数据是否达到规定大小 if(strlen($bakStr) > $fsizeb) { $nowtime = date('Y_m_d_H_i_s',time()); $bkfile = $bkdir."/duomicms_data_".$nowtime."_".$m.".txt"; $fp = fopen($bkfile,"a"); fwrite($fp,$bakStr); fclose($fp); $tmsg = "<font color='red'>完成到{$m}条记录的备份,继续备份{$nowtable}...</font>"; $doneForm = "<form name='gonext' method='post' action='admin_database.php'> <input type='hidden' name='isstruct' value='$isstruct' /> <input type='hidden' name='action' value='bak' /> <input type='hidden' name='fsize' value='$fsize' /> <input type='hidden' name='tablearr' value='$tablearr' /> <input type='hidden' name='nowtable' value='$nowtable' /> <input type='hidden' name='startpos' value='$m' /> <input type='hidden' name='bkfile' value='$bkfile' /> <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n"; PutInfo($tmsg,$doneForm); exit(); } //正常情况 $line = $intable; for($j=0;$j<=$fsd;$j++) { if($j < $fsd) { $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."',"; } else { $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."');\r\n"; } } $m++; $bakStr .= $line; } //如果数据比卷设置值小 if($bakStr!='') { fwrite($fp,$bakStr); fclose($fp); } for($i=0;$i<count($tables);$i++) { if($tables[$i]==$nowtable) { if(isset($tables[$i+1])) { $nowtable = $tables[$i+1]; $startpos = 0; break; }else { PutInfo("完成所有数据备份!",""); header('Location:admin_database.php'); exit(); } } } $tmsg = "<font color='red'>完成到{$m}条记录的备份,继续备份{$nowtable}...</font>"; $doneForm = "<form name='gonext' method='post' action='admin_database.php?action=bak'> <input type='hidden' name='isstruct' value='$isstruct' /> <input type='hidden' name='fsize' value='$fsize' /> <input type='hidden' name='tablearr' value='$tablearr' /> <input type='hidden' name='nowtable' value='$nowtable' /> <input type='hidden' name='bkfile' value='$bkfile' /> <input type='hidden' name='startpos' value='$startpos'>\r\n</form>\r\n{$dojs}\r\n"; PutInfo($tmsg,$doneForm); exit(); } //分页备份代码结束 } elseif($action=="import") { $bkdir = duomi_DATA."/".$cfg_backup_dir; $filelists = Array(); $dh = dir($bkdir); $structfile = "没找到数据结构文件"; while(($filename=$dh->read()) !== false) { if(!m_ereg('txt$',$filename)) { continue; } if(m_ereg('tables_struct',$filename)) { $structfile = $filename; } else if( filesize("$bkdir/$filename") >0 ) { $filelists[] = $filename; } } $dh->close(); include(duomi_ADMIN.'/html/admin_database_import.htm'); exit(); } elseif($action=="redat") { @set_time_limit(0); @session_write_close(); $bkdir = duomi_DATA.'/'.$cfg_backup_dir; $gotojs = "function GotoNextPage(){document.gonext."."submit();}"."\r\nset"."Timeout('GotoNextPage()',500);"; $dojs = "<script language='javascript'>$gotojs</script>"; if($bakfiles=='') { ShowMsg('没指定任何要还原的文件!','admin_database.php?action=import'); exit(); } $bakfilesTmp = $bakfiles; $bakfiles = explode(',',$bakfiles); $structfile = "duomicms_tables_struct_".str_replace("duomicms_data_","",$bakfiles[0]); if(empty($delfile)) $delfile = 0; if(empty($startgo)) $startgo = 0; if($redStruct!='' && file_exists("$bkdir/$structfile")) { $tbdata = ''; $fp = fopen("$bkdir/$structfile",'r'); while(!feof($fp)) { $tbdata .= fgets($fp,1024); } fclose($fp); $querys = explode(';',$tbdata); foreach($querys as $q) { $dsql->ExecuteNoneQuery(trim($q).';'); } if($delfile==1) { @unlink("$bkdir/$structfile"); } $tmsg = "<font color='red'>完成数据表信息还原,准备还原数据...</font>"; $doneForm = "<form name='gonext' method='post' action='admin_database.php?action=redat'> <input type='hidden' name='startgo' value='1' /> <input type='hidden' name='delfile' value='$delfile' /> <input type='hidden' name='bakfiles' value='$bakfilesTmp' /> </form>\r\n{$dojs}\r\n"; PutInfo($tmsg,$doneForm); exit(); } else { $nowfile = $bakfiles[0]; $bakfilesTmp = m_ereg_replace($nowfile."[,]{0,1}","",$bakfilesTmp); $oknum=0; if( filesize("$bkdir/$nowfile") > 0 ) { $fp = fopen("$bkdir/$nowfile",'r'); while(!feof($fp)) { $line = trim(fgets($fp,512*1024)); if($line=="") { continue; } $rs = $dsql->ExecuteNoneQuery($line); if($rs) { $oknum++; } } fclose($fp); } if($delfile==1) { @unlink("$bkdir/$nowfile"); } if($bakfilesTmp=="") { ShowMsg('成功还原所有的文件的数据!','admin_database.php?action=import'); exit(); } $tmsg = "成功还原{$nowfile}的{$oknum}条记录<br/><br/>正在准备还原其它数据..."; $doneForm = "<form name='gonext' method='post' action='admin_database.php?action=redat'> <input type='hidden' name='redStruct' value='$redStruct' /> <input type='hidden' name='delfile' value='$delfile' /> <input type='hidden' name='bakfiles' value='$bakfilesTmp' /> </form>\r\n{$dojs}\r\n"; PutInfo($tmsg,$doneForm); exit(); } } else { $mysql_version = $dsql->GetVersion(); $dsql->SetQuery("Show Tables"); $dsql->Execute('t'); while($row = $dsql->GetArray('t',MYSQL_BOTH)) { if(m_ereg("^{$cfg_dbprefix}",$row[0])) { $Tables[] = $row[0]; } } include(duomi_ADMIN.'/html/admin_database.htm'); exit(); } function sizecount($filesize) { if($filesize >= 1073741824) { $filesize = round($filesize / 1073741824 * 100) / 100 . ' GB'; } elseif($filesize >= 1048576) { $filesize = round($filesize / 1048576 * 100) / 100 . ' MB'; } elseif($filesize >= 1024) { $filesize = round($filesize / 1024 * 100) / 100 . ' KB'; } else { $filesize = $filesize . ' Bytes'; } return $filesize; } function PutInfo($msg1,$msg2) { global $cfg_dir_purview; $msginfo = "<html>\n<head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> <title>duomicms 提示信息</title> <base target='_self'/>\n</head>\n<body leftmargin='0' topmargin='0'>\n<center> <br/> <div style='width:400px;padding-top:4px;height:24;font-size:10pt;border-left:1px solid #cccccc;border-top:1px solid #cccccc;border-right:1px solid #cccccc;background-color:#DBEEBD;'>duomicms 提示信息!</div> <div style='width:400px;height:100px;font-size:10pt;border:1px solid #cccccc;background-color:#F4FAEB'> <span style='line-height:160%'><br/>{$msg1}</span> <br/><br/></div>\r\n{$msg2}"; echo $msginfo."</center>\n</body>\n</html>"; } function RpLine($str) { $str = str_replace("\r","\\r",$str); $str = str_replace("\n","\\n",$str); return $str; } ?>